import AuthUserApi from '@/api/auth/user'
import { treeDataTranslate } from '@/utils/index'

// 用户默认状态信息
const getDefaultState = () => {
  return {
    menuList: [],
    menuMap: {}
  }
}

// state 存放全局共享数据
const state = getDefaultState()

// mutation 普通方法，用于变更store中的数据
const mutations = {
  SET_MENUS: (state, menus) => {
    state.menuList = menus
  }
}

// 异步方法
const actions = {
  // 获取菜单权限列表
  getMenus({ commit }) {
    return new Promise((resolve, reject) => {
      // @/api/auth/user 发送getMenus()方法
      AuthUserApi.getMenus(state.token).then(response => {
        const { data } = response
        if (!data) {
          reject('Verification failed, please Login again.')
        }

        // 后端返回的菜单列表
        const srvMenus = data.list
        // 调用generaMenu()生成菜单权限树
        const menuTree = generaMenu(srvMenus)
        // 将菜单信息 保存在store中
        // commit的作用就是调用某个mutation函数，并传递参数
        commit('SET_MENUS', menuTree)
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  }
}

// 折叠隐藏菜单方法
const calcMenuHidden = function(menu) {
  if (!menu.children || menu.children.length <= 0) {
    return menu.hidden
  }

  let hidden = true
  for (let i = 0; i < menu.children.length; i++) {
    const hide = calcMenuHidden(menu.children[i])
    if (!hide) {
      hidden = false
    }
  }

  if (hidden) {
    return !menu.hidden
  } else {
    menu.hidden = false
    return hidden
  }
}

// 生成菜单权限树
export function generaMenu(srvMenus) {
  for (let i = 0; i < srvMenus.length; i++) {
    const menu = srvMenus[i]
    if (!menu.icon) {
      // 如果是菜单组
      if (menu.type.value === 'group') {
        menu.icon = 'list'
        // 如果是菜单
      } else if (menu.type.value === 'menu') {
        menu.icon = 'icon'
      }
    }
  }

  // 调用 @/utils/index.js 中treeDataTranslate()树形数据转换方法
  const menuTree = treeDataTranslate(srvMenus)
  for (let i = 0; i < menuTree.length; i++) {
    const menu = menuTree[i]
    // 折叠隐藏菜单
    calcMenuHidden(menu)
    // console.log(menu.name, hide)
  }

  // 挂载路由？
  const array = [{
    id: 'index',
    name: '首页',
    type: {
      value: 'menu'
    },
    openType: {
      value: 'inner'
    },
    hidden: false,
    link: '/portal',
    icon: 'el-icon-s-home'
  }]
  return array.concat(menuTree)
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

